package com.atguigu.jxc.controller;

import com.atguigu.jxc.domain.ErrorCode;
import com.atguigu.jxc.domain.ServiceVO;
import com.atguigu.jxc.domain.SuccessCode;
import com.atguigu.jxc.entity.Goods;
import com.atguigu.jxc.entity.Unit;
import com.atguigu.jxc.service.GoodsService;
import com.atguigu.jxc.vo.GoodsTypeVo;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @description 商品信息Controller
 */
@RestController
public class GoodsController {

    @Autowired
    private GoodsService goodsService;

    /**
     * 分页查询商品库存信息
     *
     * @param page        当前页
     * @param rows        每页显示条数
     * @param codeOrName  商品编码或名称
     * @param goodsTypeId 商品类别ID
     * @return
     */
    @PostMapping("goods/listInventory")
    public Map<String, Object> listInventory(Integer page, Integer rows, String codeOrName, Integer goodsTypeId) {
        return goodsService.listInventory(page, rows, codeOrName, goodsTypeId);
    }

    /**
     * 分页查询商品信息
     *
     * @param page        当前页
     * @param rows        每页显示条数
     * @param goodsName   商品名称
     * @param goodsTypeId 商品类别ID
     * @return
     */
    @PostMapping("goods/list")
    public Map<String, Object> list(Integer page, Integer rows, String goodsName, Integer goodsTypeId) {
        return goodsService.listNameAndType(page, rows, goodsName, goodsTypeId);
    }

    /**
     * 3.1、查询商品所有分类
     * 请求URL：http://localhost:8080/goodsType/loadGoodsType
     * 请求参数：无
     * 请求方式：POST
     * 返回值类型：JSON
     * 返回值：String
     */
    @PostMapping("goodsType/loadGoodsType")
    public List<GoodsTypeVo> loadGoodsType() {

        return goodsService.loadGoodsType();
    }


    /*
     * 3.2、查询所有商品单位
     * 请求URL：http://localhost:8080/unit/list
     * 请求参数：无
     * 请求方式：POST
     * 返回值类型：JSON
     * 返回值：Map<String,Object>
     * Response Example Value：
     * {
     *     "rows": [
     *         {
     *             "unitId": 1,
     *             "unitName": "元"
     *         },
     *         {
     *             "unitId": 6,
     *             "unitName": "户"
     *         }, ………
     *     ]
     * }
     */
    @PostMapping("unit/list")
    public HashMap<String, Object> getUnitList() {
        List<Unit> units = goodsService.getUnitList();
        HashMap<String, Object> map = new HashMap<>();
        map.put("rows", units);
        return map;

    }


    /*
     * 3.4、新增分类
     * 请求URL：http://localhost:8080/goodsType/save
     * 请求参数：String  goodsTypeName,Integer  pId
     * 请求方式：POST
     * 返回值类型：JSON
     * 返回值：ServiceVO
     * Response Example Value：
     * {
     *     "code": 100,
     *     "msg": "请求成功",
     *     "info": null
     * }
     */
    @PostMapping("goodsType/save")
    public ServiceVO saveType(String goodsTypeName, Integer pId) {
        boolean result = goodsService.insertType(goodsTypeName, pId);

        if (result)
            return new ServiceVO(SuccessCode.SUCCESS_CODE, SuccessCode.SUCCESS_MESS);
        return new ServiceVO(ErrorCode.PARA_TYPE_ERROR_CODE, ErrorCode.PARA_TYPE_ERROR_MESS);

    }

    /*
     *3.5、删除分类
     * 请求URL：http://localhost:8080/goodsType/delete
     * 请求参数：Integer  goodsTypeId
     * 请求方式：POST
     * 返回值类型：JSON
     * 返回值：ServiceVO
     * Response Example Value：
     * {
     *     "code": 100,
     *     "msg": "请求成功",
     *     "info": null
     * }
     */
    @PostMapping("goodsType/delete")
    public ServiceVO deleteType(Integer goodsTypeId) {
        try {
            boolean result = goodsService.deleteType(goodsTypeId);
            if (result)
                return new ServiceVO(SuccessCode.SUCCESS_CODE, SuccessCode.SUCCESS_MESS);
        } catch (Exception e){
            return new ServiceVO(ErrorCode.GOODS_TYPE_ERROR_CODE, ErrorCode.GOODS_TYPE_ERROR_MESS);
        }
        return new ServiceVO(ErrorCode.REQ_ERROR_CODE, ErrorCode.REQ_ERROR_MESS);
    }


    /**
     * 生成商品编码
     *
     * @return
     */
    @RequestMapping("goods/getCode")
    @RequiresPermissions(value = "商品管理")
    public ServiceVO getCode() {
        return goodsService.getCode();
    }

    /*
     * 3.6、商品添加或修改
     * 请求URL：http://localhost:8080/goods/save?goodsId=37
     * 请求参数：Goods goods
     * 请求方式：POST
     * 返回值类型：JSON
     * 返回值：ServiceVO
     * Response Example Value：
     * {
     *     "code": 100,
     *     "msg": "请求成功",
     *     "info": null
     * }
     */
    @PostMapping("goods/save")
    public ServiceVO saveGoods(Goods good, @RequestParam(required = false) Integer goodsId) {

//更新不修改库存和状态,保存时库存和状态给初始值
        goodsService.saveGood(goodsId, good);
        return new ServiceVO(SuccessCode.SUCCESS_CODE, SuccessCode.SUCCESS_MESS);
    }

    /*
     * 3.7、商品删除（要判断商品状态,入库、有进货和销售单据的不能删除）
     * 请求URL：http://localhost:8080/goods/delete
     * 请求参数：Integer goodsId
     * 请求方式：POST
     * 返回值类型：JSON
     * 返回值：ServiceVO
     * Response Example Value：
     * {
     *     "code": 100,
     *     "msg": "请求成功",
     *     "info": null
     * }
     */
    @PostMapping("goods/delete")
    public ServiceVO saveGoods(Integer goodsId) {

//更新不修改库存和状态,保存时库存和状态给初始值
        boolean result = goodsService.deleteGood(goodsId);
        if (result)
            return new ServiceVO(SuccessCode.SUCCESS_CODE, SuccessCode.SUCCESS_MESS);
        return new ServiceVO(ErrorCode.HAS_FORM_ERROR_CODE, ErrorCode.HAS_FORM_ERROR_MESS);
    }


    /*
     * 4.1、无库存商品列表展示（可以根据商品名称或编码查询）
     * 请求URL：http://localhost:8080/goods/getNoInventoryQuantity
     * 请求参数：Integer page,Integer rows,String nameOrCode
     * 请求方式：POST
     * 返回值类型：JSON
     * 返回值：Map<String,Object>
     * Response Example Value：
     * {
     *     "total": 8,
     *     "rows": [
     *         {
     *             "goodsId": 25,
     *             "goodsCode": "0016",
     *             "goodsName": "21",
     *             "inventoryQuantity": 0,
     *             "lastPurchasingPrice": 21.1,
     *             "minNum": 12,
     *             "goodsModel": "X",
     *             "goodsProducer": "32",
     *             "purchasingPrice": 21.1,
     *             "remarks": "21",
     *             "sellingPrice": 120,
     *             "state": 0,
     *             "goodsUnit": "盒",
     *             "goodsTypeId": 3,
     *             "goodsTypeName": "食品",
     *             "saleTotal": null
     *         }, ………
     *     ]
     * }
     */
    @PostMapping("goods/getNoInventoryQuantity")
    public Map<String,Object> getNoInventoryQuantity(Integer page,Integer rows,String nameOrCode){
        return goodsService.getNoInventoryQuantity(page, rows, nameOrCode);
    }

    @PostMapping("goods/getHasInventoryQuantity")
    public Map<String,Object> getHasInventoryQuantity(Integer page,Integer rows,String nameOrCode){
        return goodsService.getHasInventoryQuantity(page, rows, nameOrCode);
    }

    /*
     * 4.3、添加库存、修改数量或成本价
     * 请求URL：http://localhost:8080/goods/saveStock?goodsId=25
     * 请求参数：Integer goodsId,Integer inventoryQuantity,double purchasingPrice
     * 请求方式：POST
     * 返回值类型：JSON
     * 返回值：ServiceVO
     * Response Example Value：
     * {
     *     "code": 100,
     *     "msg": "请求成功",
     *     "info": null
     * }
     */
    @PostMapping("goods/saveStock")
    public ServiceVO saveStock(Integer goodsId,Integer inventoryQuantity,double purchasingPrice){
       boolean result =  goodsService.saveGoodStock(goodsId,inventoryQuantity,purchasingPrice);


        if (result)
            return new ServiceVO(SuccessCode.SUCCESS_CODE, SuccessCode.SUCCESS_MESS);
        return new ServiceVO(ErrorCode.PARA_TYPE_ERROR_CODE, ErrorCode.PARA_TYPE_ERROR_MESS);
    }


    /**
     * 添加或修改商品信息
     * @param goods 商品信息实体
     * @return
     */

    /**
     * 删除商品信息
     * @param goodsId 商品ID
     * @return
     */

    /**
     * 分页查询无库存商品信息
     * @param page 当前页
     * @param rows 每页显示条数
     * @param nameOrCode 商品名称或商品编码
     * @return
     */


    /**
     * 分页查询有库存商品信息
     * @param page 当前页
     * @param rows 每页显示条数
     * @param nameOrCode 商品名称或商品编码
     * @return
     */


    /**
     * 添加商品期初库存
     * @param goodsId 商品ID
     * @param inventoryQuantity 库存
     * @param purchasingPrice 成本价
     * @return
     */

    /**
     * 删除商品库存
     * @param goodsId 商品ID
     * @return
     */

    /**
     * 查询库存报警商品信息
     * @return
     */

}
